import 'package:flutter/material.dart';

class ContentPager extends StatefulWidget {
  // 类的重写，可以实现传参
  ContentPager({
    Key key,
    @required this.onPageChangedCallback,
    @required this.onContentPageController,
  }) : super(key: key);
  // 每次页面动画完成后执行的回调函数，从父组件中传递过来的
  final Function onPageChangedCallback;
  // 一个自定义控制器生成方法 执行完成所得到的实例
  final ContentPageController onContentPageController;

  // 创建state，系统方法
  @override
  _ContentPagerState createState() => _ContentPagerState();
}

class _ContentPagerState extends State<ContentPager> {
  // 定义个控制器
  PageController _pageController = PageController();

  @override
  void initState() {
    
    // 项目初始化，我们把当然页面的控制器进行再赋值
    // 然后父子页面使用一个控制器,而且父页面可以调用 jumpToPage 方法来进行页面跳转
    _pageController = widget.onContentPageController._pageController;
    super.initState();
  }

  // 渲染函数，系统方法
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        // 一个弹性布局的容器，可以自动填充多余空间
        Expanded(
          // PageView 是一个切换页面的一个组件
          child: PageView(
            // onPageChanged 接受一个函数，这个函数可以在页面划过后执行，相当于动画切换效果的回调函数，参数接受index索引
            onPageChanged: (int index) {
              // 父组件传递过来的函数拿到索引后执行
              widget.onPageChangedCallback(index);
            },
            controller: _pageController,
            children: <Widget>[
              PageViewItem(color: Colors.red, index: 0),
              PageViewItem(color: Colors.green, index: 1),
              PageViewItem(color: Colors.blue, index: 2),
              PageViewItem(color: Colors.yellow, index: 3),
            ],
          ),
        )
      ],
    );
  }
}

class PageViewItem extends StatelessWidget {
  // 传递颜色和 索引
  PageViewItem({Key key, @required this.index, @required this.color})
      : super(key: key);
  final int index;
  final Color color;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(20),
      child: Container(
        child: Center(
          child: Text(
            'page ${index + 1}',
            style: TextStyle(fontSize: 40),
          ),
        ),
        color: color,
      ),
    );
  }
}

// 我们自定义一个 controller控制器， 并且对 系统方法jumpToPage进行再封装，是系统类PageController上的一个方法
class ContentPageController {
  PageController _pageController = new PageController();

  // jumpToPage这个方法是我们自定义的，实例.jumpToPage 这个才是系统方法
  void jumpToPage(page) {
    _pageController.jumpToPage(page);
  }
}
